package iface.aplicativo.negocio.aps;

import iface.aplicativo.excecao.MensagemException;
import iface.aplicativo.integracao.dao.FabricanteDAO;
import iface.aplicativo.integracao.dao.ModeloDAO;
import iface.aplicativo.negocio.entidade.Modelo;
import iface.aplicativo.util.Constantes;
import iface.aplicativo.util.ResourceMessageFactory;
import iface.aplicativo.util.UtilResource;
import iface.arquitetura.comum.string.UtilString;
import iface.arquitetura.utilitario.ListaTO;
import iface.arquitetura.utilitario.ListaUtil;
import iface.arquitetura.utilitario.ResourceMessageAnnotation;

import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

@Service
@Transactional(readOnly = true, rollbackFor = { Exception.class })
public class ManterModelosAPS {

	@ResourceMessageAnnotation(propertiesFile = { Constantes.RECURSO_MENSAGENS })
	private UtilResource resource = ResourceMessageFactory.inicialize(this);

	@Resource
	ModeloDAO modeloDAO;
	@Resource
	FabricanteDAO fabricanteDAO;

	@Transactional(propagation = Propagation.REQUIRED)
	public String salvarModelo(Modelo entidade) throws Exception {
		this.validarCamposModelo(entidade);
		this.validarExistencia(entidade);

		if (entidade.getId() == null) {
			this.modeloDAO.inserir(entidade);
			return this.resource.getMensagens("MSG01");
		} else {
			this.modeloDAO.alterar(entidade);
			return this.resource.getMensagens("MSG02");
		}
	}

	@Transactional(propagation = Propagation.REQUIRED)
	public String excluirModelo(Modelo entidade) throws Exception {
		try {
			this.modeloDAO.remover(entidade);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return this.resource.getMensagens("MSG03");
	}

	public void validarCamposModelo(Modelo entidade) throws Exception {
		this.resource.clearMensagens();

		if (entidade != null) {
			if (UtilString.isVazio(entidade.getNmModelo())) {
				this.resource.addMensagens("MSG05", "Modelo");
			}
			if (entidade.getFabricante() == null
					|| entidade.getFabricante().getId() == null) {
				this.resource.addMensagens("MSG05", "Fabricante");
			}
		}

		if (this.resource.isMensagens()) {
			throw new MensagemException(this.resource.getMensagens());
		}
	}

	public void validarExistencia(Modelo entidade) throws Exception {
		this.resource.clearMensagens();

		Modelo modeloConsulta = this.modeloDAO.consultarPorNomeModelo(entidade);

		if (modeloConsulta != null) {
			this.modeloDAO.getHibernateTemplate().clear();
			if (entidade.getId() != null) {
				if (!modeloConsulta.getId().equals(entidade.getId())) {
					this.resource.addMensagens("MSG16");
				}
			} else {
				this.resource.addMensagens("MSG16");
			}
		}

		if (this.resource.isMensagens()) {
			throw new MensagemException(this.resource.getMensagens());
		}
	}

	public Modelo consultarModeloPorNome(String nmModelo) throws Exception {
		Modelo entidade = null;
		try {
			entidade = this.modeloDAO.obter(nmModelo);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return entidade;
	}

	public Collection<ListaTO> consultarTodosFabricantes() {
		final List<ListaTO> lista = ListaUtil.listaBean2Lista(
				this.fabricanteDAO.consultar(), "id", "nmFabricante");

		return lista;
	}

	public Modelo consultarModeloPorId(Long id) throws Exception {
		Modelo entidade = null;
		try {
			entidade = this.modeloDAO.obter(id);
		} catch (Exception ex) {
			throw new Exception(ex);
		}
		return entidade;
	}

	public Collection<Modelo> consultarTodosModelo() {
		return this.modeloDAO.consultar();
	}

}
